// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause

#ifndef FORTUNESERVER_H
#define FORTUNESERVER_H

#include "qthread.h"        //
//#include <QThread>        //进入后，就是：#include "qthread.h"
#include <QStringList>
#include <QTcpSocket>

//! [0]
class ClientThread : public QThread
{
    Q_OBJECT


public:
    ClientThread(QObject *parent = nullptr);
    ~ClientThread();

    void setIP(QString ip);
    void setPort(quint16 port);

    void startX(void);  //QQ不能叫start()，为什么？
    void run() override;

    QByteArray get_ba_bin();
    QString get_bin_name();

    //有规律：发送-->等待。
    enum Sta_Client {
        Idle,               //初始状态，空闲。
        WaitCon,
        SendPwd,            //连接服务器。
        WaitInfo,           //等待服务器发的数据信息
        WaitData,           //发送数据中
        RecvOk,             //发送数据确认包。
        WaitDis,            //等待断开。
        DisOk,              //服务器已断开。
        Error,              //发生错误。
    };
    Q_ENUM(Sta_Client);

    quint32 bin_sta;        //传输状态：0---正常，1---未开始，其他---错误。

public slots:
    void error_to_gui(QString err);
    //void errorOccurred(QAbstractSocket::SocketError);   //tcp连接错误。
    //void readFortune();                                 //readyRead信号的槽函数。
    void displayError(QAbstractSocket::SocketError);
    void connectX();
    void disconnect();

protected:
    //void incomingConnection(qintptr socketDescriptor) override; //

private:
    QTcpSocket* socket;
    QStringList fortunes;
    QString str_ip_server;
    quint16 port_server;
    Sta_Client sta;
    //QFile* pfile;           //
    QString bin_name;       //获取的程序文件名称，以用于界面显示。
    QByteArray ba_bin;      //存放接收的程序。

signals:
    void error(QString err);        //传输过程错误，传输提示信息。
    void TransOk(QString name);     //成功接收，传出文件名。

private slots:

};
//! [0]

#endif
